package com.cheng.io;

import com.cheng.io.entity.Address;
import com.cheng.io.entity.User;

import java.io.*;

/**
 * 对象深克隆
 * 特性:	        浅克隆	                深克隆
 * 复制范围:	    只复制对象本身	        复制对象及其引用的所有对象
 * 引用类型处理:	复制引用地址（共享对象）	创建新对象（不共享）
 * 内存占用:	    较少	                    较多
 */
public class ObjectDeepCloneTest {
    public static void main(String[] args) {
        // 准备克隆对象
        User user = new User("zhangsan", 22, new Address("HN", 1380));

        try (
                // 创建字节数组输出流和对象字节输出流
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        ) {
            // 写入对象（序列化，将Java对象拆分为字节序列）
            objectOutputStream.writeObject(user);

            objectOutputStream.flush();

            // 创建字节数组输入流和对象字节输入流
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            // 读取对象（反序列化，将字节序列组装为Java对象）
            User readUser = (User) objectInputStream.readObject();
            readUser.getAddress().setAddressName("河南");
            System.out.println(user);
            System.out.println(readUser);

            // 关闭最外层包装流
            objectInputStream.close();
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}
